在 React 中有很多種方式可以寫 CSS,將介紹幾種常見的 CSS 撰寫方式,包括外部引入 CSS 檔案、CSS Modules、Inline Styles、Styled Components 等方式。
最基本且常見的方式是在外部撰寫 CSS 檔案,再 React 元件中引入這些檔案。
用 CRA
創建的初始化 React 專案時,就會看到 App.css
檔案,它就是用外部方式引入到 App.js
中。
在這種方式中,由於我們是寫在 JSX 上,class 是 JS 的保留字無法使用,加上的 class,需要改為 className。因此,也可以透過三元運算子的方式,來做動態的新增或移除 class
<p className={isShow ? 'textTitle' : '' }>Hello World! </p>
用外部引入的方式,會出現個問題,所有引入的樣式,都是全局作用域,會造成可能的潛在問題-樣式覆蓋的問題。 我們來看下方的範例:
Header.js
和 Footer.js
:Header.js
import React from 'react';
import './Header.css';
const Header = () => {
return (
<header className="title">
This is the Header
</header>
);
};
export default Header;
Header.css
.title {
font-size: 24px;
color: red;
}
Footer.js
import React from 'react';
import './Footer.css';
const Footer = () => {
return (
<footer className="title">
This is the Footer
</footer>
);
};
export default Footer;
Footer.css
.title {
font-size: 18px;
color: blue;
}
最後出現的畫面是
文字顏色竟然全部都變成是紅色!主要是樣式被覆蓋掉了!CSS在相同的權重下,後面會覆蓋上前面的內容,Header 和 Footer 都使用了同一個類名 title。當這些組件一起使用時,CSS 規則會相互覆蓋,可能導致 Header 和 Footer 的樣式混亂,例如 Header 顯示紅色,而不是藍色。那遇到這樣的問題,可以如何解決呢? 用 CSS Modules!
CSS Modules 是一種解決全局作用域問題的方式。它允許我們將 CSS 限定在特定的組件內,避免樣式衝突。
CSS Modules帶來的好處是:
將上述的範例檔案調整一下,把 css
檔案,前面加上module 後,再引入時加上 style
。
Header.module.css
.title {
font-size: 24px;
color: red;
}
Footer.module.css
.title {
font-size: 18px;
color: blue;
}
Header.js
import React from 'react';
import styles from './Header.module.css'; // 使用 CSS Modules
const Header = () => {
return (
<header className={styles.title}>
This is the Header
</header>
);
};
export default Header;
Footer.js
import React from 'react';
import styles from './Footer.module.css'; // 使用 CSS Modules
const Footer = () => {
return (
<footer className={styles.title}>
This is the Footer
</footer>
);
};
export default Footer;
會發現這樣做之後,樣式都變得正確了! css
檔案加上module後,會在編譯後讓 class
的名稱變得不同。因此就算取相同命名的 class
,就不用擔心會有覆蓋的問題了。
Inline Styles 是將樣式直接寫在 JSX 元素的 style
屬性中,以物件的形式呈現。每個 CSS 屬性都以駝峰式命名,如 backgroundColor
,而不是傳統的 background-color
。
簡易範例:
import React from 'react';
function App() {
const containerStyle = {
textAlign: 'center',
padding: '20px',
backgroundColor: '#f0f0f0',
};
const titleStyle = {
fontSize: '24px',
color: '#333',
};
const linkStyle = {
color: '#61dafb',
textDecoration: 'none',
};
return (
<div style={containerStyle}>
<h1 style={titleStyle}>Hello, World!</h1>
<a
style={linkStyle}
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</div>
);
}
export default App;
:hover
、:before
等 CSS 偽類與偽元素以及media-query
****,這會限制部分互動效果以及響應式的設計。Styled Components
是 React 中非常流行的 CSS-in-JS 。它允許我們將 CSS 直接撰寫在 JavaScript 中,並且將樣式綁定到 React 組件上,使開發過程更加模組化和直觀。
首先,我們需要安裝 styled-components
套件。
npm install styled-components
這會將 styled-components
加入到你的專案中,準備好後我們可以在組件內開始使用它。
下面是一個簡單範例,展示如何在 React 中使用 Styled Components
定義和應用樣式。
import React from 'react';
import styled from 'styled-components';
// 定義容器樣式
const Container = styled.div`
padding: 20px;
background-color: #f0f0f0;
`;
// 定義標題樣式
const Title = styled.h1`
font-size: 24px;
color: #333;
`;
// 應用樣式於 React 組件
const App = () => {
return (
<Container>
<Title>Hello, World!</Title>
</Container>
);
};
export default App;
畫面出來後是這樣
會發現樣式名稱,它會自動生成唯一的命名class名稱,也就不用擔心會有覆蓋的問題!
除了靜態樣式,Styled Components
也支援動態樣式,能根據組件屬性來改變外觀:
const Button = styled.button`
background-color: ${props => (props.primary ? '#4CAF50' : '#f0f0f0')};
color: ${props => (props.primary ? 'white' : 'black')};
padding: 10px 20px;
`;
const App = () => {
return (
<div>
<Button primary>Primary Button</Button>
<Button>Default Button</Button>
</div>
);
};
在這個範例中,Button
組件的樣式會根據 primary
屬性的值動態改變。當 primary
為真時,按鈕會呈現綠色背景,否則會是預設的灰色背景。
Styled Components
可以輕鬆與 JavaScript 變數、屬性以及邏輯結合,使開發過程更加彈性與效率。在 React 中撰寫 CSS 的方式多樣化,每種方式都有其優點與限制,適合不同的應用場景:
選擇哪種 CSS 撰寫方式,應根據專案的需求和規模來決定。對於簡單專案,外部 CSS 或 Inline Styles 可能已經足夠,而在複雜專案中,CSS Modules 或 Styled Components 則能更好地解決樣式管理問題,提升開發體驗。
本文將會同步更新到我的部落格